﻿using System.Collections.Generic;

using System.Reflection;
using ClickLand.CorporacionPlaza.Comunes.Entidades;
using ClickLand.CorporacionPlaza.Comunes.Recursos;
using ClickLand.CorporacionPlaza.LogicaNegocio.Contratos;
using ClickLand.CorporacionPlaza.LogicaNegocio.Implementacion.ComandosContrato;
using Logger;


namespace ClickLand.CorporacionPlaza.LogicaNegocio.Fabricas
{
    /// <summary> Clase que hace de fabrica para los comandos que involucran la entidad contrato </summary>
    public class FabricaComandosContrato
    {
        /// <summary> Metodo que obtiene una instancia de un comando que agrega o modifica los datos de un contrato </summary>
        /// <param name="contrato">datos del contrato a insertar</param>
        /// <returns>Comando que inserta o agrega</returns>
        public static IComando<bool> ObtenerComandoAgregar(Contrato contrato)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return new AgregarEditar(contrato);
        }


        /// <summary> Metodo que obtiene una instancia de un comando que consulta los datos de un contrato </summary>
        /// <param name="entidad">datos del contrato a insertar</param>
        /// <returns>Comando que Consulta Contratos</returns>
        public static IComando<IList<Contrato>> ObtenerComandoConsultar(Contrato entidad)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new Consultar(entidad);
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }

        public static IComando<Contrato> ObtenerComandoConsultarId(long id)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new ConsultarId(id);
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }


        /// <summary> Comando que envia el correo de vencimiento de un contrato </summary>
        /// <param name="dias"></param>
        /// <param name="contrato"></param>
        /// <returns></returns>
        public static IComando<bool> ObtenerComandoEnviarCorreo(int dias, Contrato contrato)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new Email(dias, contrato);
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }


        /// <summary> Comando que coloca inctivo aquellas polizas que se han vencido </summary>
        /// <returns>el comando que realiza la accion</returns>
        public static IComando<bool> ObtenerComandoVencerContratos()
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new VencerContrato();
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }
    }
}
